package com.xiao.dynamic_rule.service;

import com.xiao.dynamic_rule.pojo.LogBean;
import com.xiao.dynamic_rule.pojo.RuleParam;
import com.xiao.dynamic_rule.utils.ClickhouseUtil;
import org.apache.flink.api.common.state.ListState;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * 行为序列类路径匹配查询service，clickhouse实现
 */
public class UserActionSequenceQueryServiceClickhouseImpl implements UserActionSequenceQueryService{

    Connection conn;
    // 在构造方法中连接clickhouse
    public UserActionSequenceQueryServiceClickhouseImpl() throws SQLException, ClassNotFoundException {
        conn = ClickhouseUtil.getClickhouseConnection();
    }

    /**
     * 使用clickhouse的路径类匹配查询函数来查询clickhouse的行为序列类条件，
     * 将查询的sql解耦，在规则参数中就将sql拼好，减少不必要的处理逻辑
     * @param deviceId 设备id（唯一）
     * @param eventState flink的状态
     * @param ruleParam 传入的规则以及查询clickhouse的sql
     * @return 是否符合规则
     * @throws Exception
     */
    @Override
    public boolean queryActionSequence(String deviceId,ListState<LogBean> eventState, RuleParam ruleParam) throws Exception {

        //获取传入规则中的步骤总数
        int totalStep = ruleParam.getUserActionSequenceParams().size();
        // 获取参数中的sql
        String sql = ruleParam.getActionSequenceQuerySql();

        //执行sql，得到结果
        Statement stmt = conn.createStatement();

        ResultSet resultSet = stmt.executeQuery(sql);

        int maxStep = 0;
        //遍历查询结果，确认是否符合条件
        while(resultSet.next()){
            for(int i = 2; i<totalStep - 2;i++){
                maxStep += resultSet.getInt(i);
            }
        }

        //将结果塞回规则参数中
        ruleParam.setUserActionSequenceQueriedMaxStep(ruleParam.getUserActionSequenceQueriedMaxStep() + maxStep);

        //好像没有考虑行为序列的 顺序问题？？？ （已经在clickhouse的函数中实现了，如果maxStep = 2 ，则一定是依次完成前两步）
        return maxStep == totalStep;
    }
}
